/**
 * 提醒系统工具函数
 */

/**
 * 计算提醒的下次发生时间
 * @param {Number} hour - 小时 (0-23)
 * @param {Number} minute - 分钟 (0-59)
 * @param {Array<Number>} repeatDays - 重复日期数组 (0-6, 0为周日)
 * @returns {Date} 下次提醒时间
 */
exports.getNextOccurrence = (hour, minute, repeatDays) => {
  const now = new Date();
  const today = now.getDay(); // 0-6, 0是周日
  const currentHour = now.getHours();
  const currentMinute = now.getMinutes();
  
  // 如果没有指定重复日期，表示不重复
  if (!repeatDays || repeatDays.length === 0) {
    // 今天的设定时间点
    const reminderTime = new Date(now);
    reminderTime.setHours(hour, minute, 0, 0);
    
    // 如果当前时间已经过了今天的提醒时间，设置为明天的同一时间
    if (reminderTime <= now) {
      reminderTime.setDate(reminderTime.getDate() + 1);
    }
    
    return reminderTime;
  }
  
  // 按照日期排序，方便查找下一个提醒日期
  const sortedDays = [...repeatDays].sort((a, b) => a - b);
  
  // 今天的设定时间点
  const todayReminder = new Date(now);
  todayReminder.setHours(hour, minute, 0, 0);
  
  // 如果今天在重复日期内，且还没到时间，那么下次提醒就是今天
  if (
    sortedDays.includes(today) && 
    (currentHour < hour || (currentHour === hour && currentMinute < minute))
  ) {
    return todayReminder;
  }
  
  // 查找下一个提醒日期
  let nextDay = null;
  
  // 先找今天之后的日期
  for (const day of sortedDays) {
    if (day > today) {
      nextDay = day;
      break;
    }
  }
  
  // 如果没找到今天之后的日期，就从头开始找
  if (nextDay === null) {
    nextDay = sortedDays[0];
  }
  
  // 计算距离下一个提醒日期的天数差
  let daysUntilNext = nextDay - today;
  if (daysUntilNext <= 0) {
    daysUntilNext += 7; // 循环到下周
  }
  
  // 设置下次提醒时间
  const nextReminder = new Date(now);
  nextReminder.setDate(nextReminder.getDate() + daysUntilNext);
  nextReminder.setHours(hour, minute, 0, 0);
  
  return nextReminder;
};

/**
 * 检查提醒是否应该在今天触发
 * @param {Object} reminder - 提醒对象
 * @returns {Boolean} 是否应该触发
 */
exports.shouldTriggerToday = (reminder) => {
  if (!reminder || !reminder.enabled) return false;
  
  const today = new Date().getDay(); // 0-6, 0是周日
  
  // 检查今天是否在重复日期内
  if (!reminder.repeatDays || reminder.repeatDays.length === 0) {
    // 不重复的提醒，检查是否是今天创建的
    const createdDate = new Date(reminder.createdAt);
    const now = new Date();
    return (
      createdDate.getDate() === now.getDate() &&
      createdDate.getMonth() === now.getMonth() &&
      createdDate.getFullYear() === now.getFullYear()
    );
  }
  
  return reminder.repeatDays.includes(today);
};

/**
 * 生成提醒的显示文本
 * @param {Object} reminder - 提醒对象
 * @returns {String} 显示文本
 */
exports.generateReminderText = (reminder) => {
  if (!reminder) return '';
  
  // 根据提醒类型生成不同的提示文本
  const typeTexts = {
    'medication': '请记得服用您的',
    'measurement': '请记得测量您的',
    'exercise': '请记得进行',
    'water': '请记得饮用',
    'assessment': '请记得完成'
  };
  
  const prefix = typeTexts[reminder.type] || '请记得';
  
  return `${prefix} ${reminder.title}`;
}; 